﻿
using System;
using System.Collections;
using System.IO;
using System.Data.SqlClient;
using System.Globalization;
using System.Runtime.Serialization;
using ProtoBuf;/*https://github.com/ServiceStack/ServiceStack/tree/master/lib*/
using ServiceStack.Text;/*https://github.com/ServiceStack/ServiceStack.Text*/
using V82;
using V82.ОбщиеОбъекты;
using V82.СправочникиСсылка;
using V82.ДокументыСсылка;
using V82.Перечисления;//Ссылка;
namespace V82.СправочникиСсылка
{
	[ProtoContract]
	[DataContract]
	public partial class Номенклатура:СправочникСсылка,IСериализаторProtoBuf,IСериализаторJson
	{
		public static readonly Guid ГуидКласса = new Guid("dd0e8719-5e55-43a0-944a-8321d4c46843");
		public static readonly DateTime ВерсияКласса = DateTime.ParseExact("20120928012009.000", new string[] {"yyyyMMddHHmmss.fff"}, CultureInfo.InvariantCulture, DateTimeStyles.None);
		public static readonly long КонтрольнаяСуммаКласса = 123;
		[DataMember]
		[ProtoMember(1)]
		public Guid Ссылка {get;set;}
		[DataMember]
		[ProtoMember(2)]
		public long Версия {get;set;}
		public string ВерсияДанных {get;set;}
		/*static хэш сумма состава и порядка реквизитов*/
		/*версия класса восстановленного из пакета*/
		public bool ПометкаУдаления {get;set;}
		public bool Предопределенный {get;set;}
		public V82.СправочникиСсылка.Номенклатура Родитель {get;set;}
		public bool ЭтоГруппа {get;set;}
		public string/*11*/ Код {get;set;}
		[DataMember(Name = "Представление")]//Проверить основное представление.
		[ProtoMember(3)]
		public string/*100*/ Наименование {get;set;}
		///<summary>
		///(Общ) Код производителя
		///</summary>
		public string/*(25)*/ Артикул {get;set;}//Артикул 
		///<summary>
		///(Общ) Полное наименование, например, для печати
		///</summary>
		public string/*(0)*/ НаименованиеПолное {get;set;}//Полное наименование
		public bool Весовой {get;set;}
		///<summary>
		///(Упр)
		///</summary>
		public decimal/*(10)*/ ВесовойКоэффициентВхождения {get;set;}//Весовой коэффициент вхождения
		///<summary>
		///(Упр)
		///</summary>
		public bool ВестиОперативныйУчетОстатковНЗП {get;set;}//Вести оперативный учет остатков НЗП
		///<summary>
		///(Общ)
		///</summary>
		public bool ВестиПартионныйУчетПоСериям {get;set;}//Вести партионный учет по сериям
		///<summary>
		///(Общ)
		///</summary>
		public bool ВестиУчетПоСериям {get;set;}//Вести учет по сериям
		///<summary>
		///(Общ)
		///</summary>
		public bool ВестиУчетПоСериямВНЗП {get;set;}//Вести учет по сериям в НЗП
		///<summary>
		///(Общ)
		///</summary>
		public bool ВестиУчетПоХарактеристикам {get;set;}//Вести учет по характеристикам
		///<summary>
		///(Упр)
		///</summary>
		public V82.Перечисления/*Ссылка*/.ВидыВоспроизводстваНоменклатуры ВидВоспроизводства {get;set;}//Вид воспроизводства
		public V82.СправочникиСсылка.ВидыНоменклатуры ВидНоменклатуры {get;set;}//Вид номенклатуры
		///<summary>
		///(Общ)
		///</summary>
		public V82.СправочникиСсылка.ЕдиницыИзмерения ЕдиницаДляОтчетов {get;set;}//Единица для отчетов
		///<summary>
		///(Общ)
		///</summary>
		public V82.СправочникиСсылка.ЕдиницыИзмерения ЕдиницаХраненияОстатков {get;set;}//Единица хранения остатков
		///<summary>
		///(Общ)
		///</summary>
		public V82.СправочникиСсылка.КлассификаторЕдиницИзмерения БазоваяЕдиницаИзмерения {get;set;}//Базовая единица измерения
		///<summary>
		///(Общ)
		///</summary>
		public bool Набор {get;set;}
		public V82.СправочникиСсылка.НазначенияИспользования НазначениеИспользования {get;set;}//Назначение использования
		///<summary>
		///(Общ) Ставка НДС по умолчанию для оформления документов
		///</summary>
		public V82.Перечисления/*Ссылка*/.СтавкиНДС СтавкаНДС {get;set;}//Ставка НДС
		///<summary>
		///(Общ) Любая дополнительная информация
		///</summary>
		public string/*(0)*/ Комментарий {get;set;}
		///<summary>
		///(Общ)
		///</summary>
		public V82.СправочникиСсылка.НоменклатурныеГруппы НоменклатурнаяГруппаЗатрат {get;set;}//Номенклатурная группа затрат
		///<summary>
		///(Общ)
		///</summary>
		public bool Услуга {get;set;}
		///<summary>
		///(Общ)
		///</summary>
		public V82.СправочникиСсылка.ХранилищеДополнительнойИнформации ОсновноеИзображение {get;set;}//Основное изображение
		///<summary>
		///(Упр)
		///</summary>
		public V82.СправочникиСсылка.Контрагенты ОсновнойПоставщик {get;set;}//Основной поставщик
		///<summary>
		///(Упр)
		///</summary>
		public V82.СправочникиСсылка.Пользователи ОтветственныйМенеджерЗаПокупки {get;set;}//Ответственный менеджер за покупки
		///<summary>
		///(Общ)
		///</summary>
		public V82.СправочникиСсылка.НоменклатурныеГруппы НоменклатурнаяГруппа {get;set;}//Номенклатурная группа
		///<summary>
		///(Регл)
		///</summary>
		public V82.СправочникиСсылка.КлассификаторСтранМира СтранаПроисхождения {get;set;}//Страна происхождения
		///<summary>
		///(Регл) Номер ГТД по умолчанию
		///</summary>
		public V82.СправочникиСсылка.НомераГТД НомерГТД {get;set;}//Номер ГТД
		public bool ТребуетсяВнешняяСертификация {get;set;}//Требуется внешняя сертификация
		public bool ТребуетсяВнутренняяСертификация {get;set;}//Требуется внутренняя сертификация
		///<summary>
		///(Общ)
		///</summary>
		public V82.СправочникиСсылка.СтатьиЗатрат СтатьяЗатрат {get;set;}//Статья затрат
		public bool ВестиСерийныеНомера {get;set;}//Вести серийные номера
		///<summary>
		///(Общ)
		///</summary>
		public bool Комплект {get;set;}
		public V82.Перечисления/*Ссылка*/.НаправленияВыпуска НаправлениеВыпуска {get;set;}//Направление выпуска
		public V82.СправочникиСсылка.НаправленияСписанияВыпущеннойПродукции НаправлениеСписанияВыпущеннойПродукции {get;set;}//Направление списания выпущенной продукции
		public V82.СправочникиСсылка.ПорядокПрисвоенияСерийныхНомеров ПорядокПрисвоенияСерийногоНомера {get;set;}//Порядок присвоения серийного номера
		public V82.СправочникиСсылка.ЦеновыеГруппы ЦеноваяГруппа {get;set;}//Ценовая группа
		///<summary>
		///Общероссийский классификатор продукции
		///</summary>
		public V82.СправочникиСсылка.ОбщероссийскийКлассификаторПродукции ОКП {get;set;}
		///<summary>
		///(Общ)
		///</summary>
		public V82.СправочникиСсылка.ЕдиницыИзмерения ЕдиницаИзмеренияМест {get;set;}//Единица измерения мест
		public string/*(0)*/ ДополнительноеОписаниеНоменклатуры {get;set;}//Дополнительное описание
		public V82.СправочникиСсылка.Контрагенты Производитель {get;set;}
		public V82.СправочникиСсылка.Контрагенты Импортер {get;set;}
		
		public Номенклатура()
		{
		}
		
		public Номенклатура(byte[] УникальныйИдентификатор)
			: this(УникальныйИдентификатор,0)
		{
		}
		
		public Номенклатура(byte[] УникальныйИдентификатор,int Глубина)
		{
			if (Глубина>3)
			{
				return;
			}
			if (new Guid(УникальныйИдентификатор) == Guid.Empty)
			{
				return;
			}
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					Команда.CommandText = @"Select top 1 
					_IDRRef [Ссылка]
					,_Version [Версия]
					,_Marked [ПометкаУдаления]
					,_IsMetadata [Предопределенный]
					,_ParentIDRRef [Родитель]
					,_Folder [ЭтоГруппа]
					,_Code [Код]
					,_Description [Наименование]
					,_Fld1421 [Артикул]
					,_Fld1437 [НаименованиеПолное]
					,_Fld1423 [Весовой]
					,_Fld1424 [ВесовойКоэффициентВхождения]
					,_Fld1425 [ВестиОперативныйУчетОстатковНЗП]
					,_Fld1426 [ВестиПартионныйУчетПоСериям]
					,_Fld1427 [ВестиУчетПоСериям]
					,_Fld1428 [ВестиУчетПоСериямВНЗП]
					,_Fld1429 [ВестиУчетПоХарактеристикам]
					,_Fld1430RRef [ВидВоспроизводства]
					,_Fld1431RRef [ВидНоменклатуры]
					,_Fld1432RRef [ЕдиницаДляОтчетов]
					,_Fld1433RRef [ЕдиницаХраненияОстатков]
					,_Fld1422RRef [БазоваяЕдиницаИзмерения]
					,_Fld1435 [Набор]
					,_Fld1436RRef [НазначениеИспользования]
					,_Fld1444RRef [СтавкаНДС]
					,_Fld1434 [Комментарий]
					,_Fld1439RRef [НоменклатурнаяГруппаЗатрат]
					,_Fld1449 [Услуга]
					,_Fld1441RRef [ОсновноеИзображение]
					,_Fld1442RRef [ОсновнойПоставщик]
					,_Fld1443RRef [ОтветственныйМенеджерЗаПокупки]
					,_Fld1438RRef [НоменклатурнаяГруппа]
					,_Fld1446RRef [СтранаПроисхождения]
					,_Fld1440RRef [НомерГТД]
					,_Fld1447 [ТребуетсяВнешняяСертификация]
					,_Fld1448 [ТребуетсяВнутренняяСертификация]
					,_Fld1445RRef [СтатьяЗатрат]
					,_Fld1450 [ВестиСерийныеНомера]
					,_Fld1451 [Комплект]
					,_Fld1452RRef [НаправлениеВыпуска]
					,_Fld1453RRef [НаправлениеСписанияВыпущеннойПродукции]
					,_Fld1454RRef [ПорядокПрисвоенияСерийногоНомера]
					,_Fld1455RRef [ЦеноваяГруппа]
					,_Fld1456RRef [ОКП]
					,_Fld18593RRef [ЕдиницаИзмеренияМест]
					,_Fld22975 [ДополнительноеОписаниеНоменклатуры]
					,_Fld26548RRef [Производитель]
					,_Fld26549RRef [Импортер]
					From _Reference95(NOLOCK)
					Where _IDRRef=@УникальныйИдентификатор  -- and _Folder = 0x01  ";
					Команда.Parameters.AddWithValue("УникальныйИдентификатор", УникальныйИдентификатор);
					using (var Читалка = Команда.ExecuteReader())
					{
						if (Читалка.Read())
						{
							//ToDo: Читать нужно через GetValues()
							Ссылка = new Guid((byte[])Читалка.GetValue(0));
							var ПотокВерсии = ((byte[])Читалка.GetValue(1));
							Array.Reverse(ПотокВерсии);
							Версия =  BitConverter.ToInt64(ПотокВерсии, 0);
							ВерсияДанных =  Convert.ToBase64String(ПотокВерсии);
							ПометкаУдаления = ((byte[])Читалка.GetValue(2))[0]==1;
							Предопределенный = ((byte[])Читалка.GetValue(3))[0]==1;
							Родитель = new V82.СправочникиСсылка.Номенклатура((byte[])Читалка.GetValue(4),Глубина+1);
							ЭтоГруппа = ((byte[])Читалка.GetValue(5))[0]==0;
							Код = Читалка.GetString(6);
							Наименование = Читалка.GetString(7);
								ВидНоменклатуры = new V82.СправочникиСсылка.ВидыНоменклатуры((byte[])Читалка.GetValue(18),Глубина+1);
								ПорядокПрисвоенияСерийногоНомера = new V82.СправочникиСсылка.ПорядокПрисвоенияСерийныхНомеров((byte[])Читалка.GetValue(41),Глубина+1);
							if(!ЭтоГруппа)
							{
								Артикул = Читалка.GetString(8);
								НаименованиеПолное = Читалка.GetString(9);
								Весовой = ((byte[])Читалка.GetValue(10))[0]==1;
								ВесовойКоэффициентВхождения = Читалка.GetDecimal(11);
								ВестиОперативныйУчетОстатковНЗП = ((byte[])Читалка.GetValue(12))[0]==1;
								ВестиПартионныйУчетПоСериям = ((byte[])Читалка.GetValue(13))[0]==1;
								ВестиУчетПоСериям = ((byte[])Читалка.GetValue(14))[0]==1;
								ВестиУчетПоСериямВНЗП = ((byte[])Читалка.GetValue(15))[0]==1;
								ВестиУчетПоХарактеристикам = ((byte[])Читалка.GetValue(16))[0]==1;
								ВидВоспроизводства = V82.Перечисления/*Ссылка*/.ВидыВоспроизводстваНоменклатуры.ПустаяСсылка.Получить((byte[])Читалка.GetValue(17));
								ЕдиницаДляОтчетов = new V82.СправочникиСсылка.ЕдиницыИзмерения((byte[])Читалка.GetValue(19),Глубина+1);
								ЕдиницаХраненияОстатков = new V82.СправочникиСсылка.ЕдиницыИзмерения((byte[])Читалка.GetValue(20),Глубина+1);
								БазоваяЕдиницаИзмерения = new V82.СправочникиСсылка.КлассификаторЕдиницИзмерения((byte[])Читалка.GetValue(21),Глубина+1);
								Набор = ((byte[])Читалка.GetValue(22))[0]==1;
								НазначениеИспользования = new V82.СправочникиСсылка.НазначенияИспользования((byte[])Читалка.GetValue(23),Глубина+1);
								СтавкаНДС = V82.Перечисления/*Ссылка*/.СтавкиНДС.ПустаяСсылка.Получить((byte[])Читалка.GetValue(24));
								Комментарий = Читалка.GetString(25);
								НоменклатурнаяГруппаЗатрат = new V82.СправочникиСсылка.НоменклатурныеГруппы((byte[])Читалка.GetValue(26),Глубина+1);
								Услуга = ((byte[])Читалка.GetValue(27))[0]==1;
								ОсновноеИзображение = new V82.СправочникиСсылка.ХранилищеДополнительнойИнформации((byte[])Читалка.GetValue(28),Глубина+1);
								ОсновнойПоставщик = new V82.СправочникиСсылка.Контрагенты((byte[])Читалка.GetValue(29),Глубина+1);
								ОтветственныйМенеджерЗаПокупки = new V82.СправочникиСсылка.Пользователи((byte[])Читалка.GetValue(30),Глубина+1);
								НоменклатурнаяГруппа = new V82.СправочникиСсылка.НоменклатурныеГруппы((byte[])Читалка.GetValue(31),Глубина+1);
								СтранаПроисхождения = new V82.СправочникиСсылка.КлассификаторСтранМира((byte[])Читалка.GetValue(32),Глубина+1);
								НомерГТД = new V82.СправочникиСсылка.НомераГТД((byte[])Читалка.GetValue(33),Глубина+1);
								ТребуетсяВнешняяСертификация = ((byte[])Читалка.GetValue(34))[0]==1;
								ТребуетсяВнутренняяСертификация = ((byte[])Читалка.GetValue(35))[0]==1;
								СтатьяЗатрат = new V82.СправочникиСсылка.СтатьиЗатрат((byte[])Читалка.GetValue(36),Глубина+1);
								ВестиСерийныеНомера = ((byte[])Читалка.GetValue(37))[0]==1;
								Комплект = ((byte[])Читалка.GetValue(38))[0]==1;
								НаправлениеВыпуска = V82.Перечисления/*Ссылка*/.НаправленияВыпуска.ПустаяСсылка.Получить((byte[])Читалка.GetValue(39));
								НаправлениеСписанияВыпущеннойПродукции = new V82.СправочникиСсылка.НаправленияСписанияВыпущеннойПродукции((byte[])Читалка.GetValue(40),Глубина+1);
								ЦеноваяГруппа = new V82.СправочникиСсылка.ЦеновыеГруппы((byte[])Читалка.GetValue(42),Глубина+1);
								ОКП = new V82.СправочникиСсылка.ОбщероссийскийКлассификаторПродукции((byte[])Читалка.GetValue(43),Глубина+1);
								ЕдиницаИзмеренияМест = new V82.СправочникиСсылка.ЕдиницыИзмерения((byte[])Читалка.GetValue(44),Глубина+1);
								ДополнительноеОписаниеНоменклатуры = Читалка.GetString(45);
								Производитель = new V82.СправочникиСсылка.Контрагенты((byte[])Читалка.GetValue(46),Глубина+1);
								Импортер = new V82.СправочникиСсылка.Контрагенты((byte[])Читалка.GetValue(47),Глубина+1);
							}
							//return Ссылка;
						}
						else
						{
							//return null;
						}
					}
				}
			}
		}
		
		public V82.СправочникиОбъект.Номенклатура  ПолучитьОбъект()
		{
			var Объект = new V82.СправочникиОбъект.Номенклатура();
			Объект._ЭтоНовый = false;
			Объект.Ссылка = Ссылка;
			Объект.Версия = Версия;
			Объект.ПометкаУдаления = ПометкаУдаления;
			Объект.Предопределенный = Предопределенный;
			Объект.Родитель = Родитель;
			Объект.ЭтоГруппа = ЭтоГруппа;
			Объект.Код = Код;
			Объект.Наименование = Наименование;
			Объект.Артикул = Артикул;
			Объект.НаименованиеПолное = НаименованиеПолное;
			Объект.Весовой = Весовой;
			Объект.ВесовойКоэффициентВхождения = ВесовойКоэффициентВхождения;
			Объект.ВестиОперативныйУчетОстатковНЗП = ВестиОперативныйУчетОстатковНЗП;
			Объект.ВестиПартионныйУчетПоСериям = ВестиПартионныйУчетПоСериям;
			Объект.ВестиУчетПоСериям = ВестиУчетПоСериям;
			Объект.ВестиУчетПоСериямВНЗП = ВестиУчетПоСериямВНЗП;
			Объект.ВестиУчетПоХарактеристикам = ВестиУчетПоХарактеристикам;
			Объект.ВидВоспроизводства = ВидВоспроизводства;
			Объект.ВидНоменклатуры = ВидНоменклатуры;
			Объект.ЕдиницаДляОтчетов = ЕдиницаДляОтчетов;
			Объект.ЕдиницаХраненияОстатков = ЕдиницаХраненияОстатков;
			Объект.БазоваяЕдиницаИзмерения = БазоваяЕдиницаИзмерения;
			Объект.Набор = Набор;
			Объект.НазначениеИспользования = НазначениеИспользования;
			Объект.СтавкаНДС = СтавкаНДС;
			Объект.Комментарий = Комментарий;
			Объект.НоменклатурнаяГруппаЗатрат = НоменклатурнаяГруппаЗатрат;
			Объект.Услуга = Услуга;
			Объект.ОсновноеИзображение = ОсновноеИзображение;
			Объект.ОсновнойПоставщик = ОсновнойПоставщик;
			Объект.ОтветственныйМенеджерЗаПокупки = ОтветственныйМенеджерЗаПокупки;
			Объект.НоменклатурнаяГруппа = НоменклатурнаяГруппа;
			Объект.СтранаПроисхождения = СтранаПроисхождения;
			Объект.НомерГТД = НомерГТД;
			Объект.ТребуетсяВнешняяСертификация = ТребуетсяВнешняяСертификация;
			Объект.ТребуетсяВнутренняяСертификация = ТребуетсяВнутренняяСертификация;
			Объект.СтатьяЗатрат = СтатьяЗатрат;
			Объект.ВестиСерийныеНомера = ВестиСерийныеНомера;
			Объект.Комплект = Комплект;
			Объект.НаправлениеВыпуска = НаправлениеВыпуска;
			Объект.НаправлениеСписанияВыпущеннойПродукции = НаправлениеСписанияВыпущеннойПродукции;
			Объект.ПорядокПрисвоенияСерийногоНомера = ПорядокПрисвоенияСерийногоНомера;
			Объект.ЦеноваяГруппа = ЦеноваяГруппа;
			Объект.ОКП = ОКП;
			Объект.ЕдиницаИзмеренияМест = ЕдиницаИзмеренияМест;
			Объект.ДополнительноеОписаниеНоменклатуры = ДополнительноеОписаниеНоменклатуры;
			Объект.Производитель = Производитель;
			Объект.Импортер = Импортер;
			return Объект;
		}
		
		private static readonly Hashtable Кэш = new Hashtable(1000);
		
		public static V82.СправочникиСсылка.Номенклатура ВзятьИзКэша(byte[] УникальныйИдентификатор)
		{
			var УИ = new Guid(УникальныйИдентификатор);
			if (Кэш.ContainsKey(УИ))
			{
				return (V82.СправочникиСсылка.Номенклатура)Кэш[УИ];
			}
			var Ссылка = new V82.СправочникиСсылка.Номенклатура(УникальныйИдентификатор);
			Кэш.Add(УИ, Ссылка);
			return Ссылка;
		}
		
		public void СериализацияProtoBuf(Stream Поток)
		{
			Serializer.Serialize(Поток,this);
		}
		
		public string СериализацияJson()
		{
			return this.ToJson();
		}
		
		public string СериализацияXml()
		{
			return this.ToXml();
		}
	}
}